import {
    _decorator,
    Component,
    Node,
    NodeEventType,
    EventTouch,
    Animation,
    CCInteger,
    Vec2,
    v2,
    Vec3,
    v3,
    tween,
    Tween,
    randomRangeInt,
    sys
} from 'cc';

const {ccclass, property} = _decorator;

@ccclass('BirdController')
export class BirdController extends Component {
    /**
     * 飞行速度
     */
    @property(CCInteger)
    speed: number = 20;
    /**
     * 加分回调
     */
    addScore: Function;
    /**
     * 目标世界坐标
     */
    private targetWorldPosition: Vec3 = null;
    /**
     * 已死亡
     */
    private died: boolean = false;
    /**
     * 已销毁
     */
    private destroyed: boolean = false;

    start() {
        // 监听触摸事件
        if (sys.isBrowser) {
            this.node.on(NodeEventType.MOUSE_DOWN, (event: EventTouch) => {
                this.die();
            });
        } else {
            this.node.on(NodeEventType.TOUCH_START, (event: EventTouch) => {
                // 死亡
                this.die();
            });
        }

        // 设置目标坐标
        this.setTargetWorldPosition(v3(randomRangeInt(0, 250), 220));
        // 转向（在飞行之前，只需设置一次）
        this.changeDirection();
        // 开始飞
        this.fly();
    }

    update(deltaTime: number) {
        // 销毁
        if (this.destroyed) {
            this.node.destroy();
            return;
        }

        // 死亡
        if (this.died && this.node.worldPosition.y < 0) {
            this.destroyed = true;
            return;
        }

        // 离开屏幕
        if (this.node.worldPosition.y > 220) {
            this.destroyed = true;
            return;
        }
    }

    /**
     * 设置目标坐标
     *
     * @param targetWorldPosition 世界坐标
     */
    setTargetWorldPosition(targetWorldPosition: Vec3) {
        this.targetWorldPosition = targetWorldPosition;
    }

    /**
     * 转向
     */
    changeDirection() {
        // 转向
        if (this.targetWorldPosition.x > 125) {
            this.node.setScale(-1, 1);
        }
    }

    /**
     * 飞行
     */
    fly() {
        // 计算鸟与目标坐标之间的距离
        let deltaDistance = Math.abs(this.targetWorldPosition.y - this.node.worldPosition.y);
        // 算出飞行这段距离所需的时间
        let deltaTime = deltaDistance / this.speed;
        // 使用缓动移动目标
        tween(this.node).to(deltaTime, {worldPosition: this.targetWorldPosition}).start();
    }

    /**
     * 死亡
     */
    die() {
        // 当未死亡时
        if (!this.died) {
            // 已死亡
            this.died = true;

            // 播放死亡动画
            this.node.getComponent(Animation).play("bird_die");

            // 暂停缓动
            Tween.stopAllByTarget(this.node);
            // 重新设置目标坐标
            this.setTargetWorldPosition(v3(this.node.worldPosition.x, -30));
            // 改变下落速度
            this.speed = this.speed * 5;
            // 重新飞
            this.fly();

            // 加分
            this.addScore();
        }
    }
}

